﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace Foundation {
    /// <summary>
    /// Diese Klasse representiert eine Gruppe von Effekten.
    /// </summary>
    [DataContract]
    public class EffectGroup : IEquatable<EffectGroup>{
        /// <summary>
        /// Der Name der Kategorie
        /// </summary>
        [DataMember]
        public string Name { get; set; }
        /// <summary>
        /// Der Key, welcher die Kategorie bezeichnet
        /// </summary>
        [DataMember]
        public char Key { get; set; }
        /// <summary>
        /// Die zur Kateorie zugehörigen Effekte
        /// </summary>
        [DataMember]
        public Dictionary<char, Effect> Effects { get; private set; }        

        /// <summary>
        /// ID der EffektGroup
        /// </summary>
        [DataMember]
        public Guid ID { get; set; }

        /// <summary>
        /// Die ID des Parent Objektes
        /// </summary>
        [DataMember]
        public Guid ParentID { get; set; }

        /// <summary>
        /// Konstruktor initialiert ein EffectGroup Dictionary und erstellt eine neue ID
        /// </summary>
        public EffectGroup() {
            this.ID = Guid.NewGuid();
            this.Effects = new Dictionary<char, Effect>();            
        }        

        /// <summary>
        ///  Gibt die Representation des Objektes als String zurück
        /// </summary>
        /// <returns></returns>
        public override string ToString() {
            if (this.Key.Equals('\0') && this.Name == null) {
                return base.ToString();
            }
            else if (this.Key.Equals('\0')) {
                return this.Name;
            }
            else if (this.Name == null) {
                return string.Format("{0} - {1}", this.Key, string.Empty);
            }
            else {
                return string.Format("{0} - {1}", this.Key, this.Name);
            }
        }



        /// <summary>
        /// Vergleicht ein mitgegebenes Objekt mit sich slebst und gibt zurück, ob es sich um ein gleiches Objekt handelt
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public bool Equals(EffectGroup other) {
            return this.ID.Equals(other.ID); 
        }
    }
}
